﻿using System;

using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk;
using System.ServiceModel.Description;

namespace Fes.Xrm.Methods
{
    public class OrganizationServiceCrm
    {
        /// <summary>
        /// Esta clase consume los servicios Web de la organizacion del CRM      
        /// </summary>              

        #region # Método de Consumo Servicio WCF de Organizacion
        public static IOrganizationService ObtenerServicio(string Uri, string CrmUser, string CrmPassw)
        {
            /*Objeto con el Servicio Consumido*/
            IOrganizationService servicio;

            //Metodo de acceso a WCF de Organizacion basado en SOAP (Url organizacion, usuario y contraseña) 
            // Dichos valores, se pueden encriptar por seguridad
            //OrganizationServiceProxy ProxyServicio;                       

            // Se construye objeto de configuracion, en base a la url del CRM 
            IServiceConfiguration<IOrganizationService> configuracion = ServiceConfigurationFactory.CreateConfiguration<IOrganizationService>(new Uri(Uri));

            // Se crea el objeto con las credenciales que solicitaran la autenticacion
            ClientCredentials CredencialesCliente = new ClientCredentials();
            CredencialesCliente.UserName.UserName = CrmUser;
            CredencialesCliente.UserName.Password = CrmPassw;

            // Se consume el servicio de organización
            servicio = new OrganizationServiceProxy(configuracion, CredencialesCliente);
            return servicio;

        }
        #endregion

        #region # Método  de Consumo del Servicio de Organizacion sólo en caso de PLUGINS
        public static IOrganizationService ObtenerServicio(IPluginExecutionContext Context, IServiceProvider Prov_Servicio)
        {
            /*Objeto con el Servicio Consumido*/
            IOrganizationService Servicio;

            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)Prov_Servicio.GetService(typeof(IOrganizationServiceFactory));
            Servicio = serviceFactory.CreateOrganizationService(Context.UserId);

            return Servicio;
        }
        #endregion
    }
}
